package project.web;

import java.nio.charset.StandardCharsets;
import java.util.Objects;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import online.model.UniModel;
import online.struts.action.RestAction;
import online.view.ViewUtil;
import core.util.MojiUtil;

/**
 * ダウンロードアクション親
 *
 * @author Tadashi Nakayama
 * @version 1.0.0
 */
public abstract class DownloadBase extends RestAction {

	/**
	 * ヘッダ設定
	 *
	 * @param fname ファイル名
	 * @param name ダウンロード名。指定した場合、attachmentになる。
	 * @param request HttpServletRequestオブジェクト
	 * @param response HttpServletResponseオブジェクト
	 */
	protected final void setHttpHeader(final String fname, final String name,
					final HttpServletRequest request, final HttpServletResponse response) {

		// レスポンスヘッダ設定
		String mime = super.servlet.getServletContext().getMimeType(fname);
		response.setContentType(mime != null ? mime : "application/octet-stream");

		if (Objects.toString(name, "").isEmpty()) {
			response.setHeader("Content-Disposition",
							"inline; " + toDownloadName(fname, request));
		} else {
			response.setHeader("Content-Disposition",
							"attachment; " + toDownloadName(name, request));
		}

		response.setDateHeader("Expires", 0);
		response.setHeader("Cache-Control", "must-revalidate");
		response.setHeader("Pragma", "private");
	}

	/**
	 * CSVヘッダ判断
	 * @param model UniModel
	 * @return CSVヘッダ必要時 true を返す。
	 */
	protected final boolean needsTitle(final UniModel model) {
		return "present".equalsIgnoreCase(model.getString("header"));
	}

	/**
	 * CSVヘッダ文字列取得
	 * @param val ヘッダ有無フラグ
	 * @return CSVヘッダ文字列
	 */
	protected final String toCsvHeaderQuery(final boolean val) {
		return val ? "header=present" : "header=absent";
	}

	/**
	 * ダウンロード名取得
	 *
	 * @param name ファイル名
	 * @param request リクエスト
	 * @return ダウンロード名
	 */
	protected final String toDownloadName(final String name, final HttpServletRequest request) {
		if (request.getHeader("User-Agent").contains("Safari")) {
			return "";
		}

		if (request.getHeader("User-Agent").contains("MSIE")
						|| request.getHeader("User-Agent").contains("Trident")
						|| request.getHeader("User-Agent").contains("Chrome")) {
			String nm = MojiUtil.correctGarbled(name, MojiUtil.CHARSET_W31J);
			return "filename="
					+ new String(nm.getBytes(MojiUtil.CHARSET_W31J), StandardCharsets.ISO_8859_1);
		}

		return "filename*=" + StandardCharsets.UTF_8.name() + "''"
					+ ViewUtil.encode(name, StandardCharsets.UTF_8.name());
	}
}
